home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 September / Macworld (1998-09).dmg / Shareware World / Info / For Developers / MacZoop 1.8.3 / Required Classes / Z Headers / ZArray.h < prev    next >
Text File  |  1998-07-10  |  4KB  |  140 lines

  1. /*************************************************************************************************
  2. *
  3. *
  4. *            MacZoop - "the framework for the rest of us"         
  5. *
  6. *
  7. *
  8. *            ZArray.h            -- the basic container class object
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *            © 1996, Graham Cox
  15. *
  16. *
  17. *
  18. *
  19. *************************************************************************************************/
  20.  
  21.  
  22. #pragma once
  23.  
  24. #ifndef __ZARRAY__
  25. #define    __ZARRAY__
  26.  
  27. #ifndef __ZCOMRADE__
  28. #include    "ZComrade.h"
  29. #endif
  30.  
  31. // form of the basic grovelling function you can pass to DoForEach(). Read note below.
  32.  
  33. typedef void (*IteratorProcPtr)( void* item, const long ref );
  34.  
  35. // Form of the sort comparison function you can pass to Sort(). This function should return
  36. // -1 if a < b, +1 if a > b, and 0 if they are equal. The sort function uses a very fast
  37. // shellsort algorithm. <itema> and <itemb> are POINTERS to the data held in the array, whatever
  38. // it is. If the array contains object pointers, this is therefore a POINTER to a POINTER to the
  39. // object, not the object pointer itself. This is an important point if you use Sort() with the
  40. // ZObjectArray<> class. This is also true of the grovelling function above.
  41.  
  42. typedef short (*SortCmpProcPtr)( void* itema, void* itemb, const long ref );
  43.  
  44. // set up streaming stuff:
  45.  
  46. DEFINECLASSID( ZArray, 'zarr' );
  47.  
  48. // class definition
  49.  
  50. class ZArray : public ZComrade
  51. {
  52. protected:
  53.     Handle        a;
  54.     long        blkSize;
  55.     long        numElements;
  56.     long        physicalBlks;
  57.     
  58. public:
  59.     
  60.     ZArray( short elementSize = sizeof(Ptr));
  61.     virtual ~ZArray();
  62.  
  63. // putting stuff in the array
  64.     
  65.     virtual void    InsertItem( void* item, const long index );
  66.     virtual void    AppendItem( void* item );
  67.     virtual void    SetArrayItem( void* item, const long index );
  68.     virtual void    ConcatenateArray( ZArray* anArray );
  69.  
  70. // getting stuff out
  71.  
  72.     virtual void    GetArrayItem( void* item, const long index );
  73.     virtual long    CountItems();
  74.     virtual long    FindIndex( void* item );
  75.  
  76. // deleting items
  77.  
  78.     virtual void    DeleteItem( const long index );
  79.     
  80. // moving items
  81.  
  82.     virtual void    MoveItem( const long curIndex, const long newIndex );
  83.     virtual void    Swap( const long itema, const long itemb );
  84.     
  85. // grovelling over the items
  86.  
  87.     virtual void    DoForEach( IteratorProcPtr aProc, const long ref );
  88.     
  89. // sorting the items
  90.  
  91.     virtual void    Sort( SortCmpProcPtr compareProc, const long ref );
  92.     virtual void    Sort();
  93.     virtual short    Compare( void* itema, void* itemb, const long ref );
  94.     
  95. // inserting items in a sorted list
  96.  
  97.     virtual long    InsertSortedItem( void* item, SortCmpProcPtr compareProc, const long ref = 0 );
  98.     virtual long    InsertSortedItem( void* item, const long ref = 0 );
  99.     
  100. // finding items in a sorted list
  101.  
  102.     virtual long    BFindIndex( void* item, SortCmpProcPtr compareProc, const long ref );
  103.     
  104. // streaming
  105.  
  106.     virtual void    ReadFromStream( ZStream* aStream );
  107.     virtual void    WriteToStream( ZStream* aStream );
  108.  
  109. protected:    
  110.     
  111.     virtual void    InsertElement( const long index );        
  112.     virtual void    DeleteElement( const long index );
  113. };
  114.  
  115. Boolean        EqualMem( void* a, void* b, const unsigned long length );
  116. Boolean        EqualHandle( Handle a, Handle b );
  117.  
  118. #define        kIndexOutOfRangeErr        230
  119. #define        kElementSizeMismatchErr    231
  120. #define        kUndefinedCompProcErr    232
  121.  
  122. // message "transmitted" when array is manipulated
  123.  
  124. enum
  125. {
  126.     msgArrayItemAdded = 'arr1',
  127.     msgArrayItemDeleted,
  128.     msgArrayItemMoved,
  129.     msgArrayItemChanged,
  130.     msgArrayItemInserted
  131. };
  132.  
  133. // to improve speed, the storage is expanded in sets of blocks
  134. // according to this constant- when full, this many blocks are
  135. // added.
  136.  
  137. #define        kNumPhysicalBlockAlloc            8
  138.  
  139.  
  140. #endif